'''
开闭原则：对扩展开放（提供方），对修改关闭（使用方）。
既是，软件需求变化时，尽量通过扩展的方式去增加功能，而不要去修改原有代码的内部结构。

其他所有的原则的最终目的都是为＂开闭原则＂服务的。
举例：一个老生常谈的绘图例子。（该例子典型的符合＂依赖倒转原则＂）
1、调用类
2、抽象图形基类
3、具体继承图形类
'''
from abc import abstractmethod, ABC


class AbstractShape(ABC):
    '''
    抽象图形基类
    '''
    @abstractmethod
    def draw(self):
        '''
        图形的绘制行为
        '''
        raise NotImplementedError


class CircleShape(AbstractShape):
    '''
    绘制圆形
    '''
    def draw(self):
        print('====>> 1: drawing a circle shape!')


class RectangleShape(AbstractShape):
    '''
    绘制圆形
    '''
    def draw(self):
        print('====>> 2：drawing a rectangle shape!')

'''
新增的三角形类，并没有破坏原有代码的内部结构。
'''
class TriangleShape(AbstractShape):
    '''
    绘制三角形
    '''
    def draw(self):
        print('====>> 3：drawing a triangle shape!')


class Person(object):
    '''
    调用类（使用方）
    '''
    def drawShape(self, shape):  # shape是抽象、不具体的对象。
        shape.draw()


if __name__ == "__main__":
    per = Person()
    per.drawShape(CircleShape())
    per.drawShape(RectangleShape())
    '''
    现在我们要新增一个三角形图形:
    1、继承抽象基类，实现三角形类
    2、使用调用实例per调用。
    '''
    per.drawShape(TriangleShape())
